import java.util.Scanner;

/**
 * Creat with IntelliJ IDEA
 * Description:
 * User:WZW
 * Date:2021-10-23
 * Time:11:40
 */
public class Main {
    /*
    编写代码模拟三次密码输入的场景。
    最多能输入三次密码，密码正确，提示“登录成功”.
    密码错误,可以重新输入，最多输入三次。三次均错，则提示退出程序
     */
    public static void log(){
        Scanner scanner = new Scanner(System.in);
        int count =3;
        for (int i = count; i > 0 ; i--) {
            String psaaword = scanner.nextLine();
            if(psaaword.equals("123456")){
                System.out.println("登陆成功！");
            }else {
                System.out.println("密码错误！");
                System.out.println("你还有"+(i-1)+"次机会");
            }
        }
    }

    /*
    输出一个整数的每一位，如：123的每一位是1 ， 2 ， 3
     */
    public static void printNum(int i) {
        if(i<10){
            System.out.print(i+" ");
            return;
        }
        printNum(i/10);
        System.out.print(i%10+" ");
    }

    /*
    输出n*n的乘法口诀表，n由用户输入。
     */
    public static void printMulTable(int n) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j+"*"+i+"="+i*j+"\t");
            }
            System.out.println();
        }
    }

    /*
    有一组数据，只有一个数字是出现一次，其他是两次，请找出这个数字。
     */
    public static void func() {
        int[] arr = {1,3,5,3,1};
        int n = 0;
        for (int i = 0; i < arr.length; i++) {
            n^=arr[i];
        }
        System.out.println(n);
    }

    /*
    求斐波那契数列的第n项。(迭代实现)1 1 2 3 5 8
     */
    public static int Fib(int n) {
        if(n>2){
            return Fib(n-2)+Fib(n-1);
        }
        return 1;
    }

    /*
    求1！+2！+3！+4！+........+n!的和
     */
    public static int sumOfFac(int n) {
        int sum=0;
        int fac=1;
        for (int i = 1; i <= n; i++) {
            fac*=i;
            sum+=fac;
        }
        return sum;
    }

    /*
    求N的阶乘。
     */
    public static int Fac(int n) {
        int ret =1;
        for (int i = 1; i <= n; i++) {
            ret*=i;
        }
        return ret;
    }

    /*
    调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
     */
    public static void func2() {
        int[] arr={1,2,3,4,5,6,7};
        int left = 0;
        int right = arr.length-1;
        while(right>left){
            if(right>left && arr[left]%2!=0){
                left++;
            }
            if(right>left && arr[right]%2==0){
                right--;
            }
            if(right>left){
                int tmp=arr[left];
                arr[left]=arr[right];
                arr[right]=tmp;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

    /*
    创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
     */
    public static int max2(int n1,int n2) {
        if(n1>n2){
            return n1;
        }
        return n2;
    }

    public static int max3(int n1,int n2,int n3) {
        return max2(max2(n1,n2),n3);
    }

    /*
    在同一个类中定义多个方法：
    要求不仅可以求两个整数的最大值，还可以求两个小数的最大值，以及两个小数和一个整数的大小关系
     */

    public static int getMax(int a,int b) {
        if(a>b){
            return a;
        }
        return b;
    }
    public static float getMax(float a,float b) {
        if(a>b){
            return a;
        }
        return b;
    }
    public static float getMax(float a,float b,int c) {
        if(a>c){
            if(a>b){
                return a;
            }else{
                return b;
            }
        }
        else{
            if(c>b) {
                return c;
            }else{
                return b;
            }
        }
    }

    /*
    在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
     */
    public static int sum(int a,int b) {
        return a+b;
    }
    public static float sum(float a,float b,float c) {
        return a+b+c;
    }

    /*
    青蛙跳台阶问题
     */
    public static int fragJump(int n) {
        if(n>2){
            return fragJump(n-2)+fragJump(n-1);
        }
        return n;
    }

    /*
    递归求解汉诺塔问题
     */
    public static int tower(int n) {
        if(n>1){
            return tower(n-1)*2+1;
        }
        return n;
    }

    /*
    递归求斐波那契数列的第 N 项
     */
    public static int FibNum(int n) {
        if(n>2){
            return FibNum(n-2)+FibNum(n-1);
        }
        return 1;
    }

    /*
    写一个递归方法，输入一个非负整数，返回组成它的数字之和
     */
    public static int getSum(int n) {
        if(n>9){
            return getSum(n/10)+(n%10);
        }
        return n;
    }

    /*
    按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) （递归）
     */
    public static void pritNum(int n) {
        if(n>9){
            pritNum(n/10);
            System.out.print(n%10+" ");
            return;
        }
        System.out.print(n+" ");;
    }
    /*
    递归求 1 + 2 + 3 + ... + 10
     */
    public static int sumUp(int n) {
        if(n>1){
            return n+sumUp(n-1);
        }
        return n;
    }

    /*
    递归求 N 的阶乘
     */
    public static int func3(int n) {
        if(n>1){
            return n*func3(n-1);
        }
        return n;
    }

    public static void main(String[] args) {
        int n =5;
        System.out.println(func3(n));
//        System.out.println(sumUp(10));

//        int num = 125;
//        pritNum(num);
//        System.out.println(getSum(num));

//        int n=5;
//        System.out.println(FibNum(n));

//        int n = 3;
//        System.out.println(tower(n));

//        int n = 4;
//        System.out.println(fragJump(n));

//        System.out.println(sum(2, 3));
//        float i = 1.1f;
//        float j = 1.2f;
//        float k = 1.3f;
//        System.out.println(sum(i,j,k));

//        int a = 5;
//        int b = 1;
//        int c = 6;
//        System.out.println(max2(a, b));
//        System.out.println(max3(a,b,c));

//        func2();

//        int n = 5;
//        System.out.println(Fac(n));
//        System.out.println(sumOfFac(n));
//        System.out.println(Fib(n));

//        func();

//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt();
//        printMulTable(n);

//        int i =123;
//        printNum(123);

        //log();
    }
    public static void main1(String[] args) {
    /*
    获取一个数二进制序列中所有的偶数位和奇数位， 分别输出二进制序列
    */
        int num = 7;
        for (int j = 31; j >= 1; j-=2) {//偶数位
            System.out.print(((num>>>j)&1)+" ");
        }
        System.out.println();
        for (int i = 30 ; i >= 0; i-=2) {//奇数位
            System.out.print(((num>>>i)&1)+" ");
        }
    }
}
